package StringBuilder和StringBuffer.面试题;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-06-20
 * Time: 13:51
 */
/*
面试题：
1. String、StringBuffer、StringBuilder的区别
- String的内容不可修改，StringBuffer和StringBuilder的内容可以修改
- StringBuffer和StringBuilder的大部分功能是相似的。
- StringBuffer采用同步处理，属于线程安全操作，而StringBuilder未采用同步处理，属于线程不安全操作

2. 以下总共创建了多少个String对象【前提不考虑常量池之前是否存在】

 */
public class Test {
    public static void main(String[] args) {
        String str = new String("ab");//会创建多少个对象
        String str1 = new String("a") + new String("b");//会创建多少个对象
    }
}
/*
在Java中，使用new关键字创建一个对象时，就会在堆内存中分配一个新的对象实例。现在，来分析一下你的代码，看看分别创建了多少个对象。

对于第一行代码：

java
String str = new String("ab");
这里会创建两个对象：

一个是在字符串常量池中创建的字符串字面量"ab"（如果池中尚未存在该字面量）。但请注意，如果之前已经有相同的字符串字面量存在于常量池中，则不会创建新的字面量对象。
另一个是通过new String("ab")在堆上创建的一个新的String对象，该对象的内容与字符串常量池中的"ab"相同，但是是堆上的一个独立副本。
所以，这行代码至少会创建一个堆上的String对象，可能还会在字符串常量池中创建一个对象（如果之前不存在的话）。

对于第二行代码：

java
String str1 = new String("a") + new String("b");
这里发生的事情稍微复杂一些：

首先，字符串字面量"a"和"b"会被放入字符串常量池（如果它们之前不存在的话）。
然后，通过new String("a")和new String("b")在堆上分别创建两个新的String对象。
当执行字符串连接操作时（使用+运算符），Java会创建一个新的StringBuilder对象（在某些情况下可能是StringBuffer，但在大多数情况下是StringBuilder），并使用其append方法来连接两个字符串。然后，通过调用StringBuilder的toString方法来创建一个表示连接结果的新String对象。
因此，这行代码至少会创建以下对象：

两个在堆上的String对象（通过new String("a")和new String("b")创建）。
一个StringBuilder对象（或类似的可变字符序列对象）。
一个表示连接结果的String对象（通过StringBuilder的toString方法创建）。
另外，如果字符串常量池中之前没有"a"和"b"这两个字面量，那么还会在池中创建这两个对象。

综上所述，str的初始化至少会创建一个对象（堆上的String），可能还会在字符串常量池中创建一个；而str1的初始化则会创建至少四个对象（两个堆上的String，一个StringBuilder，以及一个表示连接结果的String），同样，如果字符串常量池中之前没有相关字面量，还会在池中创建。不过，请注意，JVM的具体实现和版本可能会影响这些细节。
 */